using System;
using System.Linq;
using System.Collections.Generic;

namespace Nice157Advices.Advices
{
    /// <summary>
    /// 28、理解延迟求值和主动求值之间的区别
    /// </summary>
    public static class _28
    {
        /*
            在延迟求值的情况下，只是定义了一个查询，而且不是立刻执行。对查询结果的访问每次都会遍历原集合。如上文中对于temp1的迭代，在迭代之前，我们修改了list[0]的值，可以看到，修改直接影响了迭代的输出。对查询调用ToList、ToArray等方法，将会使其立即执行，由于对list[0]的修改是在temp2查询之后进行的，所以针对list[0]的修改不会影响到temp2的结果。

            /* NOTE:
            在使用Linq to SQL时，延迟求值能够带来显著的性能提升。举个例子：如果定义了两个查询：而且采用延迟求值，CLR会合并两次查询并生成一个最终的查询。
         */
        public static void Go ()
        {
            List<int> list = new List<int> () { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            var temp1 = from c in list where c > 5 select c;
            var temp2 = (from c in list where c > 5 select c).ToList<int> ();
            list[0] = 11;
            Console.Write ("temp1:");
            foreach (var item in temp1)
            {
                Console.Write (item.ToString () + " ");
            }
            Console.Write ("\ntemp2:");
            foreach (var item in temp2)
            {
                Console.Write (item.ToString () + " ");
            }
        }
    }
}